package utils

/*
	使用6bit的二进制数表示每个参数是否有无。1代表有提供参数选项，0代表没有提供该参数选项
	bitSize 1 0 0 0 0 0
	pvkf    0 1 0 0 0 0
	pukf    0 0 1 0 0 0
	plaf    0 0 0 1 0 0
	plas    0 0 0 0 1 0
	cipf    0 0 0 0 0 1
	                                       参数列表值
	a、生成公钥和私钥		1 1 1 0 0 0 === 56
	b、根据私钥生成公钥		0 1 1 0 0 0 === 24
	c、加密文件输出到文件	0 0 1 1 0 1 === 13
	d、加密字符串输出到文件	0 0 1 0 1 1 === 11
	f、解密文件输出到文件	0 1 0 1 0 1 === 21
	g、解密文件输出到屏幕   0 1 0 0 0 1 === 17

*/

// 为每个参数选项创建二进制常量
const (
	cipfValue = 1 << iota
	plasValue
	plafValue
	pukfValue
	pvkfValue
	bitSizeValue
)

// 参数列表类型
type ParameterList struct {
	bitSize bool
	pvkf    bool
	pukf    bool
	plaf    bool
	plas    bool
	cipf    bool
}

// 构造NewParameterList对象
func NewParameterList(bitSize, pvkf, pukf, plaf, plas, cipf bool) *ParameterList {
	return &ParameterList{
		bitSize: bitSize,
		pvkf:    pvkf,
		pukf:    pukf,
		plaf:    plaf,
		plas:    plas,
		cipf:    cipf,
	}
}

// 进行异或运算得到最终参数列表值
func (p *ParameterList) ParameterValue() uint8 {
	var initValue uint8 = 0
	if p.bitSize {
		initValue = initValue ^ bitSizeValue
	}
	if p.pvkf {
		initValue = initValue ^ pvkfValue
	}
	if p.pukf {
		initValue = initValue ^ pukfValue
	}
	if p.plaf {
		initValue = initValue ^ plafValue
	}
	if p.plas {
		initValue = initValue ^ plasValue
	}
	if p.cipf {
		initValue = initValue ^ cipfValue
	}
	return initValue
}
